package api

import (
	"strconv"

	// "GinAdmin/internal/model"
	// "GinAdmin/internal/service"
	// "GinAdmin/pkg/logger"
	"GinAdmin/core/logger"
	"GinAdmin/model"
	"GinAdmin/service"

	"github.com/gin-gonic/gin"
)

// UserAPI 用户API
type UserAPI struct {
	userService *service.UserService
}

// NewUserAPI 创建用户API控制器
func NewUserAPI() *UserAPI {
	return &UserAPI{
		userService: service.NewUserService(),
	}
}

// Login 用户登录
// @Summary 用户登录
// @Description 用户登录并返回JWT令牌
// @Tags 认证
// @Accept json
// @Produce json
// @Param loginRequest body model.LoginRequest true "登录请求"
// @Success 200 {object} model.Response "登录成功"
// @Failure 400 {object} model.Response "请求错误"
// @Failure 401 {object} model.Response "登录失败"
// @Router /api/v1/login [post]
func (u *UserAPI) Login(c *gin.Context) {
	var req model.LoginRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, model.Response{
			Code: 400,
			Msg:  "无效的请求参数",
		})
		return
	}

	token, user, err := u.userService.Login(req.Username, req.Password)
	if err != nil {
		logger.Error("用户登录失败: %v", err)
		c.JSON(401, model.Response{
			Code: 401,
			Msg:  "用户名或密码错误",
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "登录成功",
		Data: gin.H{
			"token": token,
			"user":  user,
		},
	})
}

// GetUserInfo 获取当前用户信息
// @Summary 获取当前用户信息
// @Description 获取当前登录用户的详细信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Success 200 {object} model.Response "成功"
// @Failure 401 {object} model.Response "未授权"
// @Router /api/v1/user/info [get]
func (u *UserAPI) GetUserInfo(c *gin.Context) {
	userID, exists := c.Get("userID")
	if !exists {
		c.JSON(401, model.Response{
			Code: 401,
			Msg:  "未授权",
		})
		return
	}

	user, err := u.userService.GetUserByID(userID.(uint))
	if err != nil {
		logger.Error("获取用户信息失败: %v", err)
		c.JSON(500, model.Response{
			Code: 500,
			Msg:  "获取用户信息失败",
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "获取用户信息成功",
		Data: user,
	})
}

// GetUserList 获取用户列表
// @Summary 获取用户列表
// @Description 分页获取用户列表
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param page query int false "页码，默认1"
// @Param size query int false "每页数量，默认10"
// @Param username query string false "用户名过滤"
// @Param realname query string false "真实姓名过滤"
// @Param mobile query string false "手机号过滤"
// @Param status query int false "状态过滤"
// @Param role_id query int false "角色ID过滤"
// @Param dept_id query int false "部门ID过滤"
// @Success 200 {object} model.Response "成功"
// @Failure 401 {object} model.Response "未授权"
// @Router /api/v1/users [get]
func (u *UserAPI) GetUserList(c *gin.Context) {
	page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
	size, _ := strconv.Atoi(c.DefaultQuery("size", "10"))

	params := &model.UserSearchParams{
		Username: c.Query("username"),
		RealName: c.Query("realname"),
		Mobile:   c.Query("mobile"),
	}

	if status, err := strconv.Atoi(c.DefaultQuery("status", "0")); err == nil {
		params.Status = status
	}

	if roleID, err := strconv.Atoi(c.DefaultQuery("role_id", "0")); err == nil {
		params.RoleID = uint(roleID)
	}

	if deptID, err := strconv.Atoi(c.DefaultQuery("dept_id", "0")); err == nil {
		params.DeptID = uint(deptID)
	}

	users, total, err := u.userService.GetUserList(page, size, params)
	if err != nil {
		logger.Error("获取用户列表失败: %v", err)
		c.JSON(500, model.Response{
			Code: 500,
			Msg:  "获取用户列表失败",
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "获取用户列表成功",
		Data: model.PageResult{
			List:  users,
			Total: total,
		},
	})
}

// CreateUser 创建用户
// @Summary 创建用户
// @Description 创建新用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param createRequest body model.CreateUserRequest true "用户创建请求"
// @Success 200 {object} model.Response "成功"
// @Failure 400 {object} model.Response "请求错误"
// @Failure 401 {object} model.Response "未授权"
// @Router /api/v1/users [post]
func (u *UserAPI) CreateUser(c *gin.Context) {
	var req model.CreateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, model.Response{
			Code: 400,
			Msg:  "无效的请求参数",
		})
		return
	}

	err := u.userService.CreateUser(&req)
	if err != nil {
		logger.Error("创建用户失败: %v", err)
		c.JSON(500, model.Response{
			Code: 500,
			Msg:  "创建用户失败: " + err.Error(),
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "创建用户成功",
	})
}

// UpdateUser 更新用户
// @Summary 更新用户
// @Description 更新用户信息
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param id path int true "用户ID"
// @Param updateRequest body model.UpdateUserRequest true "用户更新请求"
// @Success 200 {object} model.Response "成功"
// @Failure 400 {object} model.Response "请求错误"
// @Failure 401 {object} model.Response "未授权"
// @Router /api/v1/users/{id} [put]
func (u *UserAPI) UpdateUser(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		c.JSON(400, model.Response{
			Code: 400,
			Msg:  "无效的用户ID",
		})
		return
	}

	var req model.UpdateUserRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, model.Response{
			Code: 400,
			Msg:  "无效的请求参数",
		})
		return
	}

	err = u.userService.UpdateUser(uint(id), &req)
	if err != nil {
		logger.Error("更新用户失败: %v", err)
		c.JSON(500, model.Response{
			Code: 500,
			Msg:  "更新用户失败: " + err.Error(),
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "更新用户成功",
	})
}

// DeleteUser 删除用户
// @Summary 删除用户
// @Description 删除指定用户
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param id path int true "用户ID"
// @Success 200 {object} model.Response "成功"
// @Failure 400 {object} model.Response "请求错误"
// @Failure 401 {object} model.Response "未授权"
// @Router /api/v1/users/{id} [delete]
func (u *UserAPI) DeleteUser(c *gin.Context) {
	id, err := strconv.ParseUint(c.Param("id"), 10, 32)
	if err != nil {
		c.JSON(400, model.Response{
			Code: 400,
			Msg:  "无效的用户ID",
		})
		return
	}

	err = u.userService.DeleteUser(uint(id))
	if err != nil {
		logger.Error("删除用户失败: %v", err)
		c.JSON(500, model.Response{
			Code: 500,
			Msg:  "删除用户失败: " + err.Error(),
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "删除用户成功",
	})
}

// ChangePassword 修改密码
// @Summary 修改密码
// @Description 修改当前用户密码
// @Tags 用户管理
// @Accept json
// @Produce json
// @Security ApiKeyAuth
// @Param passwordRequest body model.ResetPasswordRequest true "密码修改请求"
// @Success 200 {object} model.Response "成功"
// @Failure 400 {object} model.Response "请求错误"
// @Failure 401 {object} model.Response "未授权"
// @Router /api/v1/user/password [put]
func (u *UserAPI) ChangePassword(c *gin.Context) {
	var req model.ResetPasswordRequest
	if err := c.ShouldBindJSON(&req); err != nil {
		c.JSON(400, model.Response{
			Code: 400,
			Msg:  "无效的请求参数",
		})
		return
	}

	userID, exists := c.Get("userID")
	if !exists {
		c.JSON(401, model.Response{
			Code: 401,
			Msg:  "未授权",
		})
		return
	}

	err := u.userService.ChangePassword(userID.(uint), req.OldPassword, req.NewPassword)
	if err != nil {
		logger.Error("修改密码失败: %v", err)
		c.JSON(500, model.Response{
			Code: 500,
			Msg:  "修改密码失败: " + err.Error(),
		})
		return
	}

	c.JSON(200, model.Response{
		Code: 200,
		Msg:  "修改密码成功",
	})
}
